/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.model;

import java.util.ArrayList;

import ade.prime.database.Database;
import ade.prime.exception.AAAException;

public abstract class ScheduleUpdater {

	protected ArrayList<Lesson> insert ; //Nouveaux cours à inserer

	protected ArrayList<Lesson> update ; //Cours modifiés à modifier

	protected ArrayList<Lesson> delete ; //Cours à supprimer
	
	protected boolean importantChange ;// Indique si un cours du futur proche 
									   // à été modifé/inséré/supprimé

	/**
	 * Initialise <code>ScheduleUpdater</code>
	 */
	protected ScheduleUpdater() {
		super() ;
		this.insert = new ArrayList<Lesson>() ;
		this.update = new ArrayList<Lesson>() ;
		this.delete = new ArrayList<Lesson>() ;
		this.importantChange = false ;
	}// ScheduleUpdater()

	/**
	 * Initialise les champs liste dans lesquel on stoquera les cours triés (nouveau, modifié, supprimé).
	 */
	protected void initialize () {
		this.insert.clear() ;
		this.update.clear() ;
		this.delete.clear() ;
		this.importantChange = false ;
	}// initialize()

	/**
	 * Comparaison de 2 emplois du temps.
	 * @param oldS ancien emploi du temps
	 * @param newS emploi du temps récupéré
	 */
	public void compare (Schedule oldS, Schedule newS) {
		this.initialize() ;
		this.compareS(oldS, newS) ;
	}// compare(Schedule, Schedule) 

	/**
	 * Comparaison de 2 emplois du temps.
	 * @param oldS
	 * @param newS
	 */
	protected abstract void compareS (Schedule oldS, Schedule newS) ;

	/**
	 * Insère dans la base de données les cours de la liste de nouveaux cours.
	 * @throws AAAException 
	 */
	public void insert(Database db) throws AAAException {
		if (this.insert.isEmpty()) {
			return ; // No rows to insert
		}// if
		db.insertLessons(this.insert) ;
	}// insert()

	/**
	 * Met à jour dans la base de données les cours de la liste de cours modifiés.
	 * @throws AAAException 
	 */
	public void update(Database db) throws AAAException  {
		if (this.update.isEmpty()) {
			return ; // No rows to update
		}// if
		db.updateLessons(this.update) ;
	}// update()

	/**
	 * Supprime de la base de données les cours de la liste de cours à supprimés.
	 * @throws AAAException 
	 */
	public void delete(Database db) throws AAAException  {
		if (this.delete.isEmpty()) {
			return ; // No rows to delete
		}// if
		db.removeLessons(this.delete) ;
	}// delete()

	/**
	 * Insère, met à jour et supprime les cours de la base de données.
	 * @throws AAAException 
	 */
	public void updateSchedule(Database db) throws AAAException {
		this.delete(db) ;
		this.update(db) ;
		this.insert(db) ;
	}// updateSchedule(Database)

	/**
	 * Indique si un cours du futur proche (2 prochain jours) à été modifié.
	 * 
	 * @return	{@code true} si un tel cours à été modifié, {@code false} sinon
	 */
	public boolean importantChange() {
		return this.importantChange ;
	}// importantChange()

}